//给你一个仅由整数组成的有序数组，其中每个元素都会出现两次，唯有一个数只会出现一次。 
//
// 请你找出并返回只出现一次的那个数。 
//
// 你设计的解决方案必须满足 O(log n) 时间复杂度和 O(1) 空间复杂度。 
//
// 
//
// 示例 1: 
//
// 
//输入: nums = [1,1,2,3,3,4,4,8,8]
//输出: 2
// 
//
// 示例 2: 
//
// 
//输入: nums =  [3,3,7,7,10,11,11]
//输出: 10
// 
//
// 
//
// 
// 
//
// 提示: 
//
// 
// 1 <= nums.length <= 10⁵ 
// 0 <= nums[i] <= 10⁵ 
// 
//
// Related Topics 数组 二分查找 👍 721 👎 0


package LeetCode.editor.cn;

/**
 * @author ldltd
 * @date 2024-11-10 22:55:45
 * @description 540.有序数组中的单一元素
 */
public class SingleElementInASortedArray{
	 public static void main(String[] args) {
	 	 //测试代码
	 	 SingleElementInASortedArray fun=new SingleElementInASortedArray();
	 	 Solution solution = fun.new Solution();
		 System.out.println(solution.singleNonDuplicate(new int[]{1,1,2}));
	 }
	 
//力扣代码
//leetcode submit region begin(Prohibit modification and deletion)
class Solution {
    public int singleNonDuplicate(int[] nums) {
        int l=0 ,r=nums.length-1;
		while (l<r){
			int m=l+((r-l)>>1);
			if(isTarget(nums,m)) return nums[m];
			if(m>0&&nums[m-1]!=nums[m]){
				if(m%2==0){
					l=m+1;
				}else {
					r=m;
				}
			}else {
				if(m%2==0){
					r=m-2;
				}else {
					l=m+1;
				}
			}
		}
		return nums[l];
    }
	public  boolean isTarget(int [] nums,int i){
		return i<nums.length-1&&nums[i+1]!=nums[i]&&i>0&&nums[i-1]!=nums[i];
	}


	public int singleNonDuplicate1(int[] nums) {
		int left = -1;
		int right = nums.length / 2;
		while (left + 1 < right) {
			int mid = (left + right) >>> 1;
			if (nums[mid * 2] != nums[mid * 2 + 1]) {
				right = mid;
			} else {
				left = mid;
			}
		}
		return nums[right * 2];
	}

}
//leetcode submit region end(Prohibit modification and deletion)

}
